<?php

namespace Lite\Sql\Mysqli;

class MysqliConnection implements Connection {

	/**
	 * @var Mysqli
	 */
	private $mysqli;

	/**
	 * Abre una conexion con el servidor 
	 */
	function open($addr, $user, $auth, $attr = null){
		
		if(!class_exists('Mysqli')) {
			throw new \RuntimeException('Mysqli extension is not available');
		}
		
		if(!$this->mysqli instanceof Mysqli) {
			$this->mysqli = new Mysqli();
		}
		
		$this->mysqli->connect($addr, $user, $auth, $attr);
		
		if($this->mysqli->connect_error) {
			throw new ConnectionException($this->mysqli->connect_error);
		}
	}

	/**
	 * Checkea el estado de conexion
	 *
	 * @return boolean
	 */
	function ping(){
		if($this->mysqli instanceof Mysqli) {
			return $this->mysqli->ping();
		}
		return false;
	}

	/**
	 * Cierra la conexion actual
	 * 
	 * @return boolean
	 */
	function close(){
		if($this->mysqli instanceof Mysqli) {
			return $this->mysqli->close();
		}
		return true;
	}

	/**
	 * Selecciona una base de datos para utilizar
	 * 
	 * @param string $name nombre de la base de datos a utilizar
	 * @return boolean
	 */
	function selectDb($name){
		if($this->mysqli instanceof Mysqli) {
			return $this->mysqli->select_db($name);
		}
		return false;
	}

	/**
	 * Ejecuta una consulta SQL utilizando la conexion actual 
	 *
	 * @param string $sql
	 * 
	 * @return mixed
	 * 
	 * @throws ConnectionException
	 */
	function execute($sql){
		
		if(!$this->mysqli instanceof Mysqli) {
			throw new SqlException('Operation not valid without a connection');
		}
		
		try {
			$result = $this->mysqli->query($sql);
		} catch(SqlException $exp) {
			throw new SqlException($this->getError(), $this->getErrorCode(), $exp);
		}
		
		if($this->getError()) {
			throw new SqlException($this->getError(), $this->getErrorCode());
		}
		
		return $result instanceof Mysqli_Result ? new MysqliResultSet($result) : $result;
	}

	/**
	 * Devuelve la cantidad de filas afectadas por la ultima consulta SQL
	 * ejecutada
	 * 
	 * @return int
	 */
	function affectedRows(){
		if($this->mysqli instanceof Mysqli) {
			return $this->mysqli->affected_rows();
		}
		return 0;
	}

	/**
	 * Devuelve el ID generado por la ultima consulta INSERT o <code>null</code>
	 * 
	 * @return integer
	 */
	function insertId(){
		if($this->mysqli instanceof Mysqli) {
			return $this->mysqli->insert_id();
		}
		return false;
	}

	/**
	 * 
	 */
	function getErrorCode(){
		if($this->mysqli instanceof Mysqli) {
			return $this->mysqli->errno;
		}
	}

	/**
	 * 
	 */
	function getError(){
		if($this->mysqli instanceof Mysqli) {
			return $this->mysqli->error;
		}
	}
}
